import Vue from 'vue';
import axios from 'axios';
import baseUrl from './getIp.js';

// 注意：axios 在 uni-app 小程序中不能直接使用，需要配合 adapter
// 如果您没有自定义 adapter，请先安装 @hyong80/axios-adapter-unicloud 或手动实现

const service = axios.create({
    baseURL: baseUrl,
    timeout: 30000,
    // 注意：crossDomain 不是标准配置，uni.request 不支持 CORS 概念
});

// ⚠️ 关键：设置 transformRequest 改变请求参数格式
service.interceptors.request.use(
    config => {
        config.headers['Content-Type'] = 'application/x-www-form-urlencoded';
        
        const token = uni.getStorageSync("token");
        if (token) {
            config.headers.token = token;
        }

        // 序列化 form-data
        config.transformRequest = [function (data = {}) {
            return Object.entries(data)
                .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`)
                .join("&");
        }];

        return config;
    },
    error => {
        return Promise.reject(error);
    }
);

// ✅ 响应拦截器：只判断网络层是否成功（HTTP 状态码）
service.interceptors.response.use(
    response => {
        // ✅ 这里只判断 HTTP 状态码
        const res = response;

        if (res.status >= 200 && res.status < 300) {
            // ✅ 返回真实数据，由业务层判断 data.code 是否成功
            return res.data;
        } else {
            // 💥 网络层错误，构造错误对象
            const err = {};
            switch (res.status) {
                case 400:
                    err.info = "请求无效(400)";
                    break;
                case 401:
                    err.info = "登录已超时，请重新登录(401)";
                    break;
                case 403:
                    err.info = "拒绝访问(403)";
                    break;
                case 404:
                    err.info = "请求地址出错(404)";
                    break;
                case 405:
                    err.info = "方法不允许(405)";
                    break;
                case 408:
                    err.info = "请求超时(408)";
                    break;
                case 500:
                    err.info = "服务器内部错误(500)";
                    break;
                case 501:
                    err.info = "服务未实现(501)";
                    break;
                case 502:
                    err.info = "网关错误(502)";
                    break;
                case 503:
                    err.info = "服务不可用(503)";
                    break;
                case 504:
                    err.info = "网关超时(504)";
                    break;
                default:
                    err.info = "网络波动，请重试";
            }
            const message = res.data?.message || res.data?.msg || err.info;
            return Promise.reject(new Error(message));
        }
    },
    error => {
        console.log('网络请求失败:', error);

        let errorMessage = '请求失败';

        // ✅ 安全判断：区分网络错误和响应错误
        if (error.response) {
            // 服务器返回了响应（如 500、404）
            const { status, data } = error.response;
            switch (status) {
                case 401:
                    errorMessage = "登录失效，请重新登录";
                    // 可触发登出
                    break;
                case 500:
                    errorMessage = "服务器错误";
                    break;
                default:
                    errorMessage = data?.message || data?.error || `服务器错误(${status})`;
            }
        } else if (error.request) {
            // 请求已发出，但无响应（网络断开、超时、域名错误）
            errorMessage = "网络连接失败，请检查网络或服务器是否启动";
        } else {
            // 其他错误（如配置错误）
            errorMessage = error.message || "未知错误";
        }

        // ✅ 使用 uni.showToast 提示用户
        uni.showToast({
            title: errorMessage,
            icon: 'none',
            duration: 3000
        });

        // ✅ 关键：不要返回 error.response.data（可能为 undefined）
        // 而是返回一个包含信息的普通对象或字符串
        return Promise.reject({ message: errorMessage });
    }
);

export default service;